//
//  ACNetworking.h
//  ACFramework
//
//  Created by caoyq on 2018/11/12.
//

#import <Foundation/Foundation.h>
#import "ACNetworkBody.h"
#import "ACNetworkManager.h"

/**
 对 ACNetworkManager 再封装，单独提供 post、get、upload、download 四种初始化方法。
 对于前四种不合适的，可以使用最后一个基础方法进行自定义参数。
 
 项目中先单独调用网络监控：[ACNetworkManager manager];
 
 对于实际项目一般可以再封装一层，或写个分类，目的是：
 - 对于具体项目固定 allHeaderFields
 - 统一管理下载文件存储路径
 - 补充项目底层的公共传参
 - 对上传图片或视频进行区分，同时保障 fileName 与 mimeType 的正确性
 */
@interface ACNetworking : NSObject

/**
 POST请求

 @param url 完整url字符串
 @param vcName 控制器名字
 @param allHeaderFields 添加进请求头中的字典
 @param parameters 参数字典
 @param success 成功回调
 @param failure 失败回调
 @return instance of NSURLSessionTask.
 */
+ (NSURLSessionTask *)postWithUrl: (NSString *)url
                           vcName: (NSString *)vcName
                  allHeaderFields: (NSDictionary *)allHeaderFields
                       parameters: (NSDictionary *)parameters
                          success: (ACResponseSuccessBlock)success
                          failure: (ACResponseFailureBlock)failure;

/**
 GET请求

 @param url 完整url字符串
 @param vcName 控制器名字
 @param allHeaderFields 添加进请求头中的字典
 @param parameters 参数字典
 @param success 成功回调
 @param failure 失败回调
 @return instance of NSURLSessionTask.
 */
+ (NSURLSessionTask *)getWithUrl: (NSString *)url
                          vcName: (NSString *)vcName
                 allHeaderFields: (NSDictionary *)allHeaderFields
                      parameters: (NSDictionary *)parameters
                         success: (ACResponseSuccessBlock)success
                         failure: (ACResponseFailureBlock)failure;

/**
 Download请求

 @param url 完整url字符串
 @param vcName 控制器名字
 @param fileSavePath 文件下载保存路径
 @param allHeaderFields 添加进请求头中的字典
 @param downloadProgress 下载进度回调
 @param success 成功回调
 @param failure 失败回调
 @return instance of NSURLSessionTask.
 */
+ (NSURLSessionTask *)downloadWithUrl: (NSString *)url
                               vcName: (NSString *)vcName
                         fileSavePath: (NSString *)fileSavePath
                      allHeaderFields: (NSDictionary *)allHeaderFields
                     downloadProgress: (ACResponseProgressBlock)downloadProgress
                              success: (ACResponseSuccessBlock)success
                              failure: (ACResponseFailureBlock)failure;

/**
 Upload请求

 @param url 完整url字符串
 @param vcName 控制器名字
 @param parameter 参数
 @param uploadType 上传类型
 @param fileData 文件字节流
 @param fileURL 文件本地url
 @param fileName 文件名
 @param mimeType 文件类型
 @param allHeaderFields 添加进请求头中的字典
 @param uploadProgress 上传进度回调
 @param success 成功回调
 @param failure 失败回调
 @return instance of NSURLSessionTask.
 */
+ (NSURLSessionTask *)uploadWithUrl: (NSString *)url
                             vcName: (NSString *)vcName
                          parameter: (NSDictionary *)parameter
                         uploadType: (ACUploadType)uploadType
                           fileData: (NSData *)fileData
                            fileURL: (NSURL *)fileURL
                           fileName: (NSString *)fileName
                           mimeType: (NSString *)mimeType
                    allHeaderFields: (NSDictionary *)allHeaderFields
                     uploadProgress: (ACResponseProgressBlock)uploadProgress
                            success: (ACResponseSuccessBlock)success
                            failure: (ACResponseFailureBlock)failure;

/**
 基础请求

 @param url 完整url字符串
 @param methodType 方法类型
 @param requestType 请求参数转化类型
 @param vcName 控制器名字
 @param fileSavePath 文件下载保存路径
 @param allHeaderFields 添加进请求头中的字典
 @param parameters 参数
 @param downloadProgress 下载进度回调
 @param success 成功回调
 @param failure 失败回调
 @return instance of NSURLSessionTask.
 */
+ (NSURLSessionTask *)requestWithUrl: (NSString *)url
                          methodType: (ACMethodType)methodType
                         requestType: (ACRequestType)requestType
                              vcName: (NSString *)vcName
                        fileSavePath: (NSString *)fileSavePath
                     allHeaderFields: (NSDictionary *)allHeaderFields
                          parameters: (NSDictionary *)parameters
                    downloadProgress: (ACResponseProgressBlock)downloadProgress
                             success: (ACResponseSuccessBlock)success
                             failure: (ACResponseFailureBlock)failure;

@end
